package br.com.maiscontrole.view.site.beans.abst;

import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;

import br.com.base.model.Entidade;
import br.com.base.persistencia.filter.Filtro;
import br.com.maiscontrole.facade.Facade;

/**
 * 
 * @author milton
 *
 * @param <ENTITY>
 */
public abstract class AbstractListMDV<ENTIDADE extends Entidade<Long>, FILTRO extends Filtro> {

	private List<ENTIDADE> list;
	private FILTRO filtro;
	private Facade facade;

	public AbstractListMDV(Facade facade) {
		this.setFacade(facade);
		this.criarFiltro();
		this.setList(new ArrayList<ENTIDADE>());
	}

	public abstract void consultar();

	public abstract List<ENTIDADE> consultar(FILTRO filtro);

	@SuppressWarnings("unchecked")
	public void criarFiltro() {
		try{
			ParameterizedType type = ((ParameterizedType) this.getClass().getGenericSuperclass());
			Class<FILTRO> filtro = (Class<FILTRO>) type.getActualTypeArguments()[1];
			this.setFiltro(filtro.newInstance());
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	public Facade getFacade() {
		return this.facade;
	}

	public FILTRO getFiltro() {
		return this.filtro;
	}

	public List<ENTIDADE> getList() {
		return this.list;
	}

	public void limpar(){
		this.getList().clear();
		this.getFiltro().limparCampos();
	}

	public void setFacade(Facade facade) {
		this.facade = facade;
	}

	public void setFiltro(FILTRO filtro) {
		this.filtro = filtro;
	}

	public void setList(List<ENTIDADE> list) {
		this.list = list;
	}

}
